<?php

// 定义函数处理目录映射
if (! function_exists('register_service_map')) {
    function register_service_map(string $basePath, string $namespacePrefix = 'Plugins\\Demo'): array {
        $dependencies = [];
        $layers = ['Action', 'Logic', 'Service']; // 添加控制器、逻辑、服务目录

        foreach ($layers as $layer) {
            $layerPath = $basePath . '/' . $layer;
            if (! is_dir($layerPath)) {
                continue;
            }

            $implementationPath = $layerPath; // 实现类目录
            $interfacePath = $layerPath . '/Interface'; // 接口目录

            $implementations = readFileName($implementationPath);

            $interfaces = readFileName($interfacePath);
            // 循环匹配实现类和接口
            foreach ($implementations as $impl) {
                //过滤空的
                if (empty($impl)){
                    continue;
                }
                $interfaceName = 'I' . $impl; // 假设接口名称与实现类名称相同，但以Interface结尾
                if (in_array($interfaceName, $interfaces)) {
                    $dependencies[$namespacePrefix . "\\" . $layer . '\\Interface\\' . $interfaceName] = $namespacePrefix . "\\" . $layer . "\\" . $impl;
                }
            }
        }
        return $dependencies;
    }
}

//获取plugins目录下所有的目录
if (! function_exists("getAllSubdirectories")) {


    /**
     * 获取指定目录下的所有子目录。
     *
     * @param string $path 要扫描的目录路径。
     * @return array 返回子目录的数组。
     */
    function getAllSubdirectories(string $path): array
    {
        $result = []; // 存放所有子目录的数组
        if (!is_dir($path)) {
            // 如果输入的不是目录，返回空数组
            return $result;
        }

        // 扫描目录获取列表
        $entries = scandir($path);

        // 遍历目录项来确认它们是否是目录
        foreach ($entries as $entry) {
            // 拼接完整的路径
            $fullPath = rtrim($path, '/\\') . DIRECTORY_SEPARATOR . $entry;
            // 跳过表示当前目录和上级目录的 '.' 和 '..'
            if ($entry == '.' || $entry == '..') {
                continue;
            }
            // 如果是目录，则包含进结果数组中
            if (is_dir($fullPath)) {
                $result[] = $fullPath;
            }
        }
        return $result;
    }
}
// 定义读取文件名的函数
if (! function_exists('readFileName')) {
    function readFileName(string $path): array {
        $files = scandir($path);
        $fileNames = [];

        foreach ($files as $file) {
            // 确保是 PHP 文件
            if (is_file($path . '/' . $file) && pathinfo($file, PATHINFO_EXTENSION) === 'php') {
                $fileNames[] = pathinfo($file, PATHINFO_FILENAME);
            }
        }

        return $fileNames;
    }
}
